/**
 * 
 */
package com.dalonedrow.rpg.base.systems;

import com.dalonedrow.engine.sprite.base.SimpleColor;
import com.dalonedrow.engine.sprite.base.SimpleVector3;

/**
 * @author Donald
 *
 */
public interface NPC<IO, NPCData, SCRIPT> {
	IO getFreshNPC(SCRIPT script) throws Exception;
	void computeNPCFullStats(final IO io) throws Exception;
	void killSpellLaunch(IO io);
	void releasePathFindInfo(IO io);
	void revive(IO io, long flags);
	void behaviourChange(IO io, long behavior, long behavior_param);
	void behaviourReset(IO io);
	void behaviourResetAll();
	void behaviourStack(IO io);
	void behaviourUnStack(IO io);
	void setStat(IO io, char[] statname, float value);
	void changeMoveMode(IO io, long MOVEMODE);
	void managePoison(IO io);
	void spawnSplat(SimpleVector3 pos, float dmgs, SimpleColor col, long vert, IO io, long flags);
	void spawnBlood3(SimpleVector3 pos, float dmgs, SimpleColor col, long vert, IO io, long flags);
	void applyPhysics();
	void faceTarget(IO io);
	void stareAtTarget(IO io);
	float getTrueTargetDist(IO io);
	boolean isDeadNPC(IO io);
	//long isInGroup(EERIE_3DOBJ * obj, long vert, long tw);
	//long isNearSelection(EERIE_3DOBJ * obj, long vert, long tw);
	void spawnMember(IO ioo, long num);
	int getCutFlag(char[] str);
	long getCutSelection(IO io, short flag);
	void recomputeCutFlags(IO io);
	boolean isAlreadyCut(IO io, short fl);
	long applyCuts(IO io);
	void tryToCutSomething(IO target, SimpleVector3 pos);
	boolean isPlayerStriking();
	void manageNONFight(IO io);
	void strikeStartTickCount(IO io);
	void manageFight(IO io);
	void manageAnimsEnd(IO io);
	boolean tryIOAnimMove(IO io, long animnum);
	void tryAndCheckAnim(IO io, long animnum, long layer);
	void manageAnims(IO io, float TOLERANCE);
	float getIOHeight(IO io);
	float getIORadius(IO io);
	//void getIOCyl(IO io, EERIE_CYLINDER * cyl);
	void computeTolerance(IO io, long targ, float[] dst);
	void manageNPCMovement(IO io);
	float angularDifference(float a1, float a2);
	IO getFirstNPCInSight(IO ioo);
	void checkNPC(IO io);
	void checkUnderWaterIO(IO io);
	void checkNPCEx(IO io);
	void getMaterialString(char[] origin, char[] dest);
	void needStepSound(IO io, SimpleVector3 pos, final float volume, final float power);
	void spawnAudibleSound(SimpleVector3 pos, IO source, final float factor, final float presence);
	void manageIgnition(IO io);
	void manageIgnition_2(IO io);
	
	
}
